#include "head.h"
/* Usage:  */
int main(int argc, char *argv[]){                                  

    //读取配置文件，获取ip和port
    char ip[50]={0};
    char port[10]={0};
    read_config("./config.ini",port,ip);

    //  printf("%s %s",port,ip);
    //初始化套接字
    int socket_fd;
    struct user_s user;
    memset(&user,0,sizeof(user));

    int ret_fun = function_select(&socket_fd,port,ip,&user);
    if(ret_fun == -1){
        return 0;
    }
    //获取当前用户名，得到用户看到的虚拟路径
    char cur_path[200];
    memset(cur_path,0,sizeof(cur_path));
    strcpy(cur_path,user.user_name);


    //成功登录后，创建epoll
    //将标准输入流和socket_fd加入监听
    int epoll_fd=epoll_create(1);
    epolladd(epoll_fd,socket_fd);
    epolladd(epoll_fd,STDIN_FILENO);


    printf("succeed to connect\n");


    //进入客户端业务循环逻辑
    while(1)
    {

        //read(STDIN_FILENO,stop,sizeof(stop));
        fflush(stdout);
       // memset(buf,0,sizeof(buf));
        printf("%s@%s ",user.user_name,cur_path);
        fflush(stdout);
        //申请监听队列,监听上线为10
        struct epoll_event list[10];
        int num= epoll_wait(epoll_fd,list,10,-1);
        for(int i=0;i<num;i++)
        {
            //从监听队列中获取对应的文件描述符
            int fd=list[i].data.fd;

            if(fd==STDIN_FILENO)
            {
                
                //监听到标准输入，代表输入了命令
                //从标准输入流中读取对应指令存入buf
                //将buf传入command_split,对输入的命令进行分割提取操作
                train_t command_data;
                char buf[200]={0};
                memset(&command_data,0,sizeof(train_t));
                memset(buf,0,sizeof(buf));


                ssize_t num=read(STDIN_FILENO,buf,sizeof(buf));
                if(num<=0)
                {
                    perror("read failed or EOF");
                    continue;
                }

                buf[num-1]='\0';
                int ret= cmd_split(buf,&command_data);

                if(ret==-1)
                {
                    printf("error:invalid command.please input again\n");
                    continue; 
                }
                //运行完毕后，已经从输入流中将命令分割出来
                //将命令提取出之后，将命令进行解析，交付给对应的功能函数                cmd_analyse(command_data,cur_path);  
                cmd_analyse(socket_fd,command_data,cur_path);  
            }
           if(fd==socket_fd)
            {

                char clean[200]={0};
                read(STDIN_FILENO,clean,sizeof(clean));
                printf("socket_fd affect\n");
                continue;
                //..超时重连..
                //
                //
                //主动接收服务器传递的信息
                //TODO..
            }
        }
    }

    return 0;
}
